package com.chenu.gamscriptman.service.impl;

import com.chenu.gamscriptman.domain.noindb.Message;
import com.chenu.gamscriptman.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.print.Doc;

/**
 * @author flyan
 * date 2019-12-24
 * @function
 */
@Service("messageService")
public class MessageServiceImpl implements MessageService {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /* 消息转发器 */
    public static final String SERVICE_EXCHANGES = "gamscriptman.direct";

    /* 消息框架，它帮我们完成从用户客户端到后台的消息传送 */
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /* 以下是系统可提供服务的所有任务的索引号
     * 每添加一个新的任务，都需要在这里添加上索引号
     */
    public static final int MESSAGE_TASK = -1;  /* 消息任务索引号 */
    public static final int USER_TASK = 0;      /* 用户任务索引号 */
    public static final int NOTIFY_TASK = 1;    /* 通知任务 */
    public static final int DEVICE_TASK = 2;    /* 设备任务 */
    public static final int USERDATA_TASK = 3;  /* 用户数据任务 */
    public static final int GAME_TASK = 4;      /* 游戏任务 */
    public static final int GAMEDATA_TASK = 5;  /* 游戏数据任务 */
    public static final int DOCUMENT_TASK = 6;  /* 文档任务 */

    @Autowired
    UserService userTask;
    @Autowired
    NotifyService notifyTask;
    @Autowired
    DeviceTask deviceTask;
    @Autowired
    UserDataTask userDataTask;
    @Autowired
    GameTask gameTask;
    @Autowired
    GameDataTask gameDataTask;
    @Autowired
    DocumentTask documentTask;


    @Override
    public Message sendAndReceive(int dest, Message message) {

        /* 解析用户发送意图，发送到对于的服务器，服务完成后，得到返回的消息返回给用户 */
        switch (dest){
            case USER_TASK:
                logger.info("你请求了一个用户服务...");
                return userTask.service(message);

            case NOTIFY_TASK:
                logger.info("你请求了一个通知服务...");
                return notifyTask.service(message);

            case DEVICE_TASK:
                logger.info("你请求了一个设备服务...");
                return deviceTask.task(message);

            case USERDATA_TASK:
                logger.info("你请求了一个用户数据服务...");
                return userDataTask.task(message);

            case GAME_TASK:
                logger.info("你请求了一个游戏服务...");
                return gameTask.task(message);

            case GAMEDATA_TASK:
                logger.info("你请求了一个游戏数据服务...");
                return gameDataTask.task(message);

            case DOCUMENT_TASK:
                logger.info("你请求了一个文档服务...");
                return documentTask.task(message);

            /* 不存在的服务，直接返回一个错误消息 */
            default:
                logger.warn("你请求了一个不存在的任务...");
                return MessageServiceImpl.TaskFinish(
                        message,
                        (long) MESSAGE_TASK,
                        Message.HANDLER_FAILURE,
                        "消息管理器：你请求了一个不存在的任务..."
                );
        }

    }

    /**
     * 封装并返回一个包含处理结果消息，当服务器完成后统一调用这个方法
     * @param message 构造的消息放在哪？
     * @param source 服务器报告自己的索引号，好让用户可以识别
     * @param isSuccess 是否处理成功了
     * @param data 消息携带回发数据，用户客户端那边将处理
     * @return 包含处理结果消息
     */
    public static Message TaskFinish(
            Message message,
            Long source,
            int isSuccess,
            String data
    ){
        message.setSource(source);
        message.setType(isSuccess);
        message.setData(data);

        return message;  /* 返回封装完毕的消息 */
    }

}
